using System;
using System.Collections.Generic;
using Csla;
using ENT.GP.Datos.MysqlHelper;
using System.Data;
using MySql.Data.MySqlClient;

namespace ENT.GP.Core.Proyecto
{
    [Serializable]
    public class ProyectoInversiones :
      BusinessListBase<ProyectoInversiones, ProyectoInversion>
    {
        #region Factory Methods

        internal static ProyectoInversiones NewProyectoInversiones()
        {
            return DataPortal.CreateChild<ProyectoInversiones>();
        }

        internal static ProyectoInversiones GetProyectoInversiones(int idProy)
        {
            return DataPortal.FetchChild<ProyectoInversiones>(idProy);
        }

        private ProyectoInversiones()
        { }

        #endregion

        #region Data Access

        private void Child_Fetch(int idProy)
        {
            RaiseListChangedEvents = false;

            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[1];
            parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idProy);
            foreach (DataRow items in objhm.EjecutarStoreProcedure(parametros, "Listar_Proyecto_Inversiones").Tables[0].Rows)
            {
                this.Add(ProyectoInversion.GetProyectoInversion(items));
            }

            RaiseListChangedEvents = true;
        }

        #endregion
    }


    [Serializable]
    public class ProyectoInversion : BusinessBase<ProyectoInversion>
    {
        #region Business Methods

        private static PropertyInfo<int> IdProperty = RegisterProperty<int>(o => o.Id, "Name");
        public int Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<int> ProyectoIdProperty = RegisterProperty<int>(o => o.ProyectoId, "Name");
        public int ProyectoId
        {
            get { return GetProperty(ProyectoIdProperty); }
            set { SetProperty(ProyectoIdProperty, value); }
        }

        private static PropertyInfo<int> EntidadIdProperty = RegisterProperty<int>(o => o.EntidadId, "Name");
        public int EntidadId
        {
            get { return GetProperty(EntidadIdProperty); }
            set { SetProperty(EntidadIdProperty, value); }
        }

        private static PropertyInfo<string> InstitucionProperty = RegisterProperty<string>(o => o.Institucion, "Name");
        public string Institucion
        {
            get { return GetProperty(InstitucionProperty); }
            set { SetProperty(InstitucionProperty, value); }
        }

        private static PropertyInfo<int> MonedaIdProperty = RegisterProperty<int>(o => o.MonedaId, "Name");
        public int MonedaId
        {
            get { return GetProperty(MonedaIdProperty); }
            set { SetProperty(MonedaIdProperty, value); }
        }

        private static PropertyInfo<double> FactorProperty = RegisterProperty<double>(o => o.Factor, "Name");
        public double Factor
        {
            get { return GetProperty(FactorProperty); }
            set { SetProperty(FactorProperty, value); }
        }

        private static PropertyInfo<double> ValorProperty = RegisterProperty<double>(o => o.Valor, "Name");
        public double Valor
        {
            get { return GetProperty(ValorProperty); }
            set { SetProperty(ValorProperty, value); }
        }

        private static PropertyInfo<double> DolaresProperty = RegisterProperty<double>(o => o.Dolares, "Name");
        public double Dolares
        {
            get { return GetProperty(DolaresProperty); }
            set { SetProperty(DolaresProperty, value); }
        }

        private static PropertyInfo<double> SaldoValorProperty = RegisterProperty<double>(o => o.SaldoValor, "Name");
        public double SaldoValor
        {
            get { return GetProperty(SaldoValorProperty); }
            set { SetProperty(SaldoValorProperty, value); }
        }

        private static PropertyInfo<double> SaldoDolaresProperty = RegisterProperty<double>(o => o.SaldoDolares, "Name");
        public double SaldoDolares
        {
            get { return GetProperty(SaldoDolaresProperty); }
            set { SetProperty(SaldoDolaresProperty, value); }
        }

        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Authorization Rules

        protected override void AddAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowWrite("Name", "Role");
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //AuthorizationRules.AllowEdit(typeof(ProyectoInversion), "Role");
        }

        #endregion

        #region Factory Methods

        internal static ProyectoInversion NewProyectoInversion()
        {
            return DataPortal.CreateChild<ProyectoInversion>();
        }

        internal static ProyectoInversion GetProyectoInversion(object childData)
        {
            return DataPortal.FetchChild<ProyectoInversion>(childData);
        }

        public ProyectoInversion()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        protected override void Child_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.Child_Create();
        }

        private void Child_Fetch(DataRow childData)
        {
            // TODO: load values
            LoadProperty(IdProperty, Convert.ToInt32(childData[0].ToString()));
            LoadProperty(ProyectoIdProperty, Convert.ToInt32(childData[1].ToString()));
            LoadProperty(EntidadIdProperty, Convert.ToInt32(childData[2].ToString()));
            LoadProperty(InstitucionProperty, childData[3].ToString());
            LoadProperty(MonedaIdProperty, Convert.ToInt32(childData[4].ToString()));
            LoadProperty(FactorProperty, childData[5].ToString());
            LoadProperty(ValorProperty, childData[6].ToString());
            LoadProperty(DolaresProperty, childData[7].ToString());
            LoadProperty(SaldoValorProperty, childData[8].ToString());
            LoadProperty(SaldoDolaresProperty, childData[9].ToString());
        }

        private void Child_Insert(int idPadre)
        {
            // TODO: insert values
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySql.Data.MySqlClient.MySqlParameter[] parametros = new MySql.Data.MySqlClient.MySqlParameter[7];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDP", idPadre);
                parametros[1] = new MySql.Data.MySqlClient.MySqlParameter("IDE", ReadProperty(EntidadIdProperty));
                parametros[2] = new MySql.Data.MySqlClient.MySqlParameter("I", ReadProperty(InstitucionProperty));
                parametros[3] = new MySql.Data.MySqlClient.MySqlParameter("IDM",ReadProperty(MonedaIdProperty));
                parametros[4] = new MySql.Data.MySqlClient.MySqlParameter("F", ReadProperty(FactorProperty) );
                parametros[5] = new MySql.Data.MySqlClient.MySqlParameter("V", ReadProperty(ValorProperty));
                parametros[6] = new MySql.Data.MySqlClient.MySqlParameter("VD", ReadProperty(DolaresProperty));

                objhm.EjecutarStoreProcedure("Insertar_Proyecto_Inversion", parametros);

            }
            catch (Exception)
            {

                throw;
            }
        }

        private void Child_Update(object parent)
        {
            // TODO: update values
        }

        private void Child_DeleteSelf(object parent)
        {
            HelperMySql objhm = HelperMySql.ObtenerConexion("");
            MySqlParameter[] parametros = new MySqlParameter[1];
            try
            {
                parametros[0] = new MySql.Data.MySqlClient.MySqlParameter("IDI", ReadProperty(IdProperty));
                objhm.EjecutarStoreProcedure("Eliminar_Proyecto_Inversion", parametros);
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion
    }
}
